// 购物车相关数据
import { insertCart, findCartList, deleteCart, updateCart, checkAllCart } from '@/api/cart'
import { setData, getData } from '@/utils/ls'
const RABBITCART = 'rabbit-cart'
export default {
  namespaced: true,
  state: {
    cartList: getData(RABBITCART) || []
  },
  mutations: {
    setCartList (state, list) {
      state.cartList = list
      // 数据持久化，存入本地存储一份数据
      setData(RABBITCART, list)
    },
    singloCheck (state, { skuId, selected }) {
      // 参数就是需要先知道是谁，然后知道发生了什么改变
      // 先找到是谁
      const item = state.cartList.find(ele => ele.skuId === skuId)
      // 改变它的selected状态
      item.selected = selected
      // 本地存储数据及时进行更行
      setData(RABBITCART, state.cartList)
    },
    singleCounta (state, { skuId, count }) {
      // 需要知道是谁，然后数据改变成什么
      const item = state.cartList.find(ele => ele.skuId === skuId)
      // 改变找到的它的count数据
      item.count = count
      // 本地也来一份
      setData(RABBITCART, state.cartList)
    }
  },
  actions: {
    async fetchCart (ctx, { skuId, count }) {
      // 1.发起添加购物车请求
      await insertCart({ skuId, count })
      // 2.获取购物车列表请求
      const res = await findCartList()
      // 3.调用setCartList方法，添加给state里的属性
      ctx.commit('setCartList', res.result)
    },
    async delCart (ctx, ids) {
      // 1.发起删除购物车请求
      await deleteCart(ids)
      // 2.重新获取最新购物车列表请求
      const res = await findCartList()
      // 3.调用commit里得setCartList方法，添加给state
      ctx.commit('setCartList', res.result)
    },
    async singleCheck (ctx, goods) {
      // 1.调用单选接口
      await updateCart(goods)
      // 2.获取最新的购物车列表数据
      const res = await findCartList()
      // 3.调用commit给数据列表最新数据
      ctx.commit('setCartList', res.result)
    },
    async singleCount (ctx, goods) {
      // 1.调用数量改变接口
      await updateCart(goods)
      // 2.获取最新购物车数据列表
      const res = await findCartList()
      console.log(res)
      // 3.把最新数据给state里面数据
      ctx.commit('setCartList', res.result)
    },
    async checkAll (ctx, selected) {
      // 全选逻辑

      // 1. 调用全选接口，
      await checkAllCart({
        selected,
        ids: ctx.state.cartList.map(item => item.skuId)
      })
      // 2. 获取最新购物车列表数据
      const res = await findCartList()
      // 3. 提交mutation
      ctx.commit('setCartList', res.result)
    }
  },
  getters: {
    // 购物车商品的数量之和
    allCount (state) {
      return state.cartList.reduce((a, c) => a + c.count, 0)
    },
    // 购物车商品的价格之和
    allPrice (state) {
      return state.cartList.reduce((a, c) => a + c.count * c.price, 0)
    },
    // 已选择的商品数量,selected字段为true的表示已经选中的商品
    selectedCount (state) {
      return state.cartList.filter(item => item.selected === true).reduce((a, c) => a + c.count, 0)
    },
    // 已选择商品的价格之和，selected字段为true的商品价格之和
    selectedPrice (state) {
      return state.cartList.filter(item => item.selected === true).reduce((a, c) => a + c.count * c.price, 0)
    },
    // 单选全部选中，全选选中
    checkAllCart (state) {
      return state.cartList.every(item => item.selected)
    }
  }
}
